﻿/*
*文件描述：wrt sip 呼叫接口定义
           第一版:主要涉及呼叫，注册，基本信息配置
	   2013-11-12：添加好友处理以及发送短消息。以及转移呼叫
*日期：2012-5-31 15:43:59
*作者：李建文
*/


#ifdef __cplusplus
extern "C" {
#endif	

#define WRT_LEN 64
#define URL_LEN 256

//错误描述
#define WRT_TRUE  0
#define WRT_FALSE -1
#define WRT_ERROR_NO_CMD  	-1   //无此指令或者该指令暂时不支持
#define WRT_ERROR_NO_CALL 	-2

//用户状态
#define WRT_STATUS_OFFLINE	0	//离线
#define WRT_STATUS_ONLINE 	1 	/*在线 默认状态 */
#define WRT_STATUS_BUSY		2	/*繁忙*/
#define WRT_STATUS_ONTHEPHONE   5       /*on the phone,and system auto set */
#define WRT_STATUS_OUTTOLUNCH	6       /*lunch*/
#define WRT_STATUS_NOTDISTURB	7 	/*免打扰*/
//
#define WRT_STATUS_REJECT	11      /*对方拒绝你添加她为好友*/
#define WRT_STATUS_ADD		12      /*对方增加你为好友*/

//消息投放状态
#define  WRT_MSG_STATUS_NEW	    0    /*新的消息已到达*/
#define  WRT_MSG_STATUS_PROGRESS    1	/*消息正在发送中*/
#define	 WRT_MSG_STATUS_DELIVERED   2   /*消息已经到达*/
#define  WRT_MSG_STATUS_NODELIVERED 3	/*消息未发送成功*/

//wrt_sip_caller_callback 回调中消息ID
#define MSGID  0x100000

#define MSGID_INCOMING_CALL        	MSGID+0x1	/*收到一路呼叫 参数：struct _incoming_call_info*  */ 
#define MSGID_OUTGOING_CALL_INIT  	MSGID+0x2	/*主动呼叫已经开始，可以再接受到这个消息是创建显示界面 参数int* callid*/
#define MSGID_CALL_END			MSGID+0x3	/*呼叫结束 输入参数： int* callid */
#define MSGID_CALL_RESUMING		MSGID+0x4
#define MSGID_CALL_MEDIA_RUNNING	MSGID+0x5	/* 开始通话 输入参数: int* callid */
#define MSGID_CALL_PAUSE		MSGID+0x6
#define MSGID_CALL_PAUSE_BY_REMOTE 	MSGID+0x7
#define MSGID_CALL_OUTGOING_RING	MSGID+0x8
#define MSGID_CALL_OUTGOING_EARLY_MEDIA	MSGID+0x9
#define MSGID_CALL_ERROR 		MSGID+0xa
#define MSGID_OUTGOING_CALL_RINGING	MSGID+0xb	/*主动呼叫，远端正在响铃中，参数 int *callid*/
#define MSGID_OUTGOING_CALL_PROGRESS 	MSGID+0xc 	/*主动呼叫正在进行中，参数 int * callid*/
#define MSGID_OUTGOING_CALL_ANSWERED	MSGID+0xd  	/*主动呼叫，远端已摘机,参数int * callid */
#define MSGID_DISPLAY_STATUS		MSGID+0xe	/*显示状态,参数 char* */
#define MSGID_CALL_INFO_RECEIVED 	MSGID+0xf       /*收到对方的wrt_control 信息*/
#define MSGID_MESSAGE_RECEIVED     	MSGID+0x10      /*受到即时消息 _wrt_instant_message*/
#define MSGID_OPEN_VIDEO_WINDOW		MSGID+0x11
#define MSGID_CLOSE_VIDEO_WINDOW	MSGID+0x12
#define MSGID_REGISTER_STATE		MSGID+0x13      /*注册是否成功1,成功，0，失败，2：取消成功*/
#define MSGID_CALL_STATUS		MSGID+0x14      /*当处于呼叫状态是，返回当前通话和视频的基本状态 参数 char* */

#define MSGID_TRANSLATE_STATUS		MSGID+0x15      /*呼叫转移的状态：参数int state。 .0:开始转移，1：转移处理中，2：转移成功*/
#define MSGID_FRIEND_STATE_CHANAGE	MSGID+0x16	/*好友的状态变化 输出参数int status,请看前面的状态定义*/
#define MSGID_DTMF_RECEIVED 		MSGID+0x17	/*收到对方发送的dtmf消息,输出参数int * */

//cx92755平台
#define MSGID_WRT_MESSAGE_RECEIVED	MSGID+0x18      /*收到message模块的消息。返回参数存放xml文件目录 char* */
//wrt_sip_ioctl中的 void* param 参数类型如下

typedef int ( *wrt_sip_caller_callback)(unsigned long msgid,void* param);



struct _direct_call_info
{
	char 	username[WRT_LEN];
	char 	ip[WRT_LEN]; //domain
	int 	port;
};

//注意，如果是采用非服务器的方式则需要将username 置NULL,同时设置_direct_call_info
struct _transfer_call_info{
	int 	callid;
	char 	username[WRT_LEN];
	struct _direct_call_info 	callinfo;
};

struct _auth_info{
	char 	username[WRT_LEN];
	char 	userid[WRT_LEN];
	char 	password[WRT_LEN];
};

struct _display_name_info{
	char 	displayname[WRT_LEN];
	char 	username[WRT_LEN];
};

struct _proxy_info{
	char 	ip[WRT_LEN];
	int  	port;
	char 	outboundproxy_ip[WRT_LEN];
	int	outboundproxy_port;
};

struct _agent_info{
	char 	agent_name[WRT_LEN];
	char 	version[WRT_LEN];
};

struct _video_size_info{
	int 	w;
	int 	h;
};

struct _video_pos_info{
	int 	x;
	int 	y;
	int 	w;
	int 	h;	
};

//wrt_sip_call_callback 中void* param参数定义如下

struct _incoming_call_info{
	int 	callid;
	struct _display_name_info 	_display;
};

struct _wrt_control_info{
	int 	callid;
	char* 	info;
};

struct _wrt_instant_message{
	unsigned long chatroomptr; //调用wrtsipcreatechatroom 的返回值。
	char    external_body_url[URL_LEN];
	int	userdata;
	int	msgstatus;
	int 	msglen;
	char 	msg[URL_LEN];
	
};

/*
如果在同一个域中,则domain为sip server的地址。
如果不在同一域中，domain其他sipserver地址。
*/
struct _wrt_friend_info{
	char    displayname[WRT_LEN]; //昵称
	char	username[WRT_LEN]; // 用户名。
	char 	domain[WRT_LEN]; //域名（IP地址如果端口不是5060则格式为ip:port).
	int     status; //前面定义的用户状态默认是在线。
};

/*
struct _wrt_param_info{
	union _param{
		int callid;
		wrt_sip_caller_callback _callback;
		struct _direct_call_info direct_info;
		struct _redirect_call_info redirect_info;
		struct _auth_info auth;
		struct _display_name_info _display;
		struct _proxy_info  proxy;
		struct _agent_info agent;
		struct _video_size_info videosize;
		struct _incoming_call_info incoming_info;
	}param;
};
*/

#define SIP_TRANSPORTS_UDP 0x1
#define SIP_TRANSPORTS_TCP 0x2


/*wrt_sip_ioctl中的cmd id*/
#define CMDID   0x1000      //基础呼叫处理指令头
#define CMDID2  0x2000      //基础配置处理指令头(用户认证，代理，注册管理
#define CMDID3  0x3000	    //音频视频管理配置指令头
#define CMDID4  0x4000      //日志管理
#define CMDID5  0x5000		//网络基本网络及配置

/*基础呼叫处理*/
#define CALL_CMD                        	CMDID+0x1    	/*主动呼叫 通过中心中转 输入参数 char* username , callid  通过 MSGID_OUTGOING_CALL_INIT 返回*/
#define DIRECT_CALL_CMD                 	CMDID+0x2	/*主动直接呼叫，不通过中心中转 输入参数 struct _direct_all_info* , callid  通过 MSGID_OUTGOING_CALL_INIT 返回*/
#define HOLDON_CMD                      	CMDID+0x3	/*摘机，输入参数 int callid*/
#define HANGUP_CMD                      	CMDID+0x4	/*挂机，输入参数 int callid*/
#define UNLOCK_CMD                      	CMDID+0x5	/*开锁，输入参数 int callid*/
#define TRANSFER_CALL_CMD			CMDID+0x6	/*将当前呼叫，转移到另外地址,当前呼叫中断，输入参数 struct _transfer_call_info* */
#define PAUSE_CALL_CMD 				CMDID+0x7	/*暂停当前呼叫，输入参数 int callid*/
#define PAUSE_ALL_CALL_CMD       		CMDID+0x8	/*暂停所有呼叫，输入参数 无*/
#define RESUME_CALL_CMD              		CMDID+0x9	/*恢复所有呼叫，输入参数 无*/
#define UPDATE_CALL_CMD 			CMDID+0xa	/*改变当前呼叫媒体参数，输入参数 暂未定*/
#define TERMINATE_ALL_CALL_CMD			CMDID+0xb	/*挂断所有呼叫*,输入参数 无*/
#define SET_INCOMING_CALL_TIMEOUT_CMD		CMDID+0xc	/*设置当无人接听时间 输入参数int* 单位秒默认15秒*/
#define SET_AUTO_ANSWER_CMD			CMDID+0xd     /*设置对所有的呼叫自动应答或者关闭 参数int* */


//如果存在多路，则需要设置当前显示的是那一路通话。
#define SET_CURRETN_DISPLAY_CALL_ID_CMD		CMDID+0xe     /*设置界面当前显示的呼叫的callid 参数int * */    	

#define SET_RECEIVE_MAX_CALLS_CMD		CMDID+0xf     /*设置最大的可接受的呼叫数量，默认是2(主要是为了一路转移)，参数int* */

#define SEND_MESSAGE_CMD			CMDID+0x10	/*发送消息,输如参数struct _wrt_instant_message **/
                                        	
/*基本的用户认证，及代理服务器,注册配置*/                                       	
#define SET_CALLBACK_CMD  			CMDID2+0x1	/*设置呼叫库的回调函数，输入参数wrt_sip_caller_callback */
#define SET_AUTH_CMD      			CMDID2+0x2	/*设置注册时的认证信息 输入参数struct _auth_info* */
#define SET_DISPLAY_NAME_CMD  			CMDID2+0x3	/*设置自己的昵称和用户名 输入参数struct _display_name_info * */
#define SET_PROXY_SERVER_CMD            	CMDID2+0x4	/*设置代理服务器地址和端口 输入参数struct _proxy_info* */
/*每次网络状态改变时需要调用这个指令*/
#define SET_REGISTER_ENABLE_CMD         	CMDID2+0x5	/*设置打开注册，不主动打开该选项，则不注册到代理服务器*/
#define SET_REGISTER_DISABLE_CMD       		CMDID2+0x6	/*设置关闭注册*/
#define SET_REGISTER_EXPIRES_CMD        	CMDID2+0x7	/*设置注册有效期 输入参数int* time 单位秒*/

#define SET_ADD_FRIEND_CMD			CMDID2+0x8	/*设置增加好友输入参数struct _wrt_friend_info * */
#define SET_DEL_FRIEND_CMD			CMDID2+0x9	/*设置删除某个好友,输入参数struct _wrt_friend_info * */
#define SET_MY_STATE_CMD			CMDID2+0xa	/*设置自己当前的状态改变，输入参数int* status(状态定义请看前面) */
#define SET_CLEAR_TEMP_SUBSCRIBE_CMD		CMDID2+0xb	/*清空临时黑名单,输入参数无*/


/*音频视频管理及配置*/
#define SET_VIDEO_ENABLE_CMD            	CMDID3+0x1	/*设置打开视频*/
#define SET_VIDEO_DISABLE_CMD           	CMDID3+0x2	/*设置关闭视频*/
#define SET_VIDEO_PREVIEW_EANBLE_CMD   		CMDID3+0x3	/*设置打开视频预览*/
#define SET_VIDEO_PREVIEW_DISABLE_CMD   	CMDID3+0x4	/*设置关闭视频预览*/
#define SET_AUDIO_ENABLE_CMD            	CMDID3+0x5	/*设置打开音频*/
#define SET_AUDIO_DISABLE_CMD           	CMDID3+0x6	/*设置关闭音频*/
#define SET_LOCAL_RING_FILE_CMD			CMDID3+0x7	/*设置本地铃声文件 输入参数char* path wav file*/
#define SET_RING_BACK_FILE_CMD			CMDID3+0x8	/*设置本地回铃声文件 输入参数char* path wav file*/
#define SET_VIDEO_SIZE_BY_WH_CMD 		CMDID3+0x9	/*设置视频大小通过宽度高度 输入参数 struct _video_size_info * */
#define SET_VIDEO_SIZE_BY_NAME_CMD		CMDID3+0xa	/*设置视频大小通过与设定的名称 输入参数 char* (QCIF,CIF,VGA等) */

/*下面两条指令，暂时不使用*/
#define SET_VIDEO_SELF_VIEW_ENABLE_CMD  	CMDID3+0xb     /*设置打开显示自己的视频,比如打开视频在某一个角落*/
#define SET_VIDEO_SELF_VIEW_DISABLE_CMD		CMDID3+0xc	/*设置关闭显示自己的视频*/

#define SET_VIDEO_STATIC_PICTURE_FILE_CMD	CMDID3+0xd	/*设置没有摄像头时，采用静态图文件名 输入参数char* path*/
#define SET_RECORD_AUDIO_ENABLE_CMD		CMDID3+0xe	/*设置打开留言*/
#define SET_RECORD_AUDIO_DISABLE_CMD		CMDID3+0xf	/*设置关闭留言*/
#define SET_RECORD_PLAY_FILE_CMD		CMDID3+0x10	/*设置留言播放音 输入参数 char* path */
#define SET_RECORD_SAVE_FILE_CMD		CMDID3+0x11	/*设置留言保存位置，输入参数char* path*/
#define SET_VIDEO_DEVICE_CMD			CMDID3+0x12	/*设置视频设备，输入参数int id*/

//此指令只针对嵌入式平台92755
#define SET_VIDEO_DISPLAY_POS_CMD		CMDID3+0x13     /*设置显示视频的起始位置, 输入参数struct _video_pos_info* */

//下面两个指令只针对WIN32
#define SET_VIDEO_WINDOW_ID_CMD			CMDID3+0x14     /*设置视频显示窗口，输入参数unsigned long* (窗口句柄）*/
#define SET_VIDEO_PREVIEW_WINDOW_ID_CMD		CMDID3+0x15     /*设置视频预览窗口，输入参数unsigned long* (窗口句柄）*/

/*日志管理*/
#define SET_LOG_ENABLE_CMD              	CMDID4+0x1	/*设置打开日志*/
#define SET_LOG_DISABLE_CMD          		CMDID4+0x2	/*设置关闭日志*/
#define SET_LOG_TO_FILE_CMD            		CMDID4+0x3	/*设置日志输出文件 输入参数FILE* file  */
#define SET_START_EC_CALIBRATION		CMDID4+0x4      /*测试回声消除的延时值*/
//此指令只针对cx92755
#define SET_DEVICE_TYPE				CMDID4+0x5      /* 设置设备类型分机：0，主机：1*/


/*网络基本管理及配置*/
#define SET_USER_AGENT_CMD            		CMDID5+0x1     /*设置SIP中user agent信息. 输入参数struct _agent_info* */                                  	
#define SET_IPV6_ENABLE_CMD 			CMDID5+0x2	/*设置打开IPV6*/
#define SET_IPV6_DISABLE_CMD         		CMDID5+0x3    	/*设置关闭IPV6*/                    	
#define SET_AUDIO_RTP_PORT_CMD  		CMDID5+0x4	/*设置音频RTP接收端口 输入参数short* */
#define SET_AUDIO_JITTCOMP_CMD   		CMDID5+0x5	/*设置音频RTP接收缓冲大小 输入参数int* 单位秒*/
#define SET_VIDEO_RTP_PORT_CMD 			CMDID5+0x6	/*设置视频RTP接口端口 输入参数short* */
#define SET_SIP_PORT_CMD  			CMDID5+0x7	/*设置SIP协议使用端口 输入参数short* */
#define SET_SIP_TRANSPORTS_CMD			CMDID5+0x8	/*设置SIP使用转输协议 输入参数int *  SIP_TRANSPORTS_UDP/TCP*/
#define SET_IPV4_DEFAULT_GATEWAY_CMD		CMDID5+0x9      /*设置IPV4默认的网关* 输入参数char* ip*/
#define SET_STUN_SERVER_CMD			CMDID5+0xa          /*设置stun服务器 ,输入参数char* ip*/
#define SET_UPLOAD_BANDWIDTH_CMD		CMDID5+0xb 			/*设置音视频上传的带宽 输入参数int * 单位K*/
#define SET_DOWNLOAD_BANDWIDTH_CMD		CMDID5+0xc			/*设置音视频下载的带宽 输入参数int * 单位K*/
#define GET_UPLOAD_BANDWIDTH_CMD		CMDID5+0xd			/*获取音视频上传的带宽 输入参数int*  单位K*/
#define GET_DOWNLOAD_BANDWIDTH_CMD		CMDID5+0xe			/*设置音视频下载的带宽 输入参数int*  单位K*/


#define GET_CALL_BASE_STATUS			CMDID5+0xf	/*获取呼叫时，基本的会叫状态,音频和视频带宽信息*/

#define SET_180_OR_183_CMD			CMDID5+0x10    /*设置，收到呼叫时，是否支持早期媒体数据，输入参数int *  值为180或者183*/

//下面两个指令仅仅为CX92755平台准备
#define SET_WRT_MESSAGE_URL_CMD			CMDID5+0x11	/*设置wrt message 模块获取xml消息的url，输入参数char* */
#define SET_WRT_MESSAGE_DIR_CMD			CMDID5+0x12	/*设置wrt message 模块获取xml消息后，xml文件存放的地址,输入参数char* */

#define SET_NET_KEEP_ALIVE_CMD			CMDID5+0x13   /*open or close keepalive in param:0:disable,1:enabled*/


//呼叫库回调函数，呼叫库将通过该函数返回消息给上层应用
//param[0] == call id 

//config_file_path:配置文件路径，如果路径文件不存在，将被创建。主要配置all settings, call logs, friends, proxies... 如果设置NULL将不保存，任何配置信息
//factory_config__file_path:保存个人偏好的配置文件, 该配置信息将优先于config_file_path配置。可以设置为NULL.



int wrt_sip_open(const char* config_file_path,const char* factory_config_file_path);

int wrt_sip_start();

#if 1
//成功返回 WRT_TRUE,否则WRT_FALSE
int wrt_sip_ioctl(unsigned long cmd,void* param,int size);
#endif

int wrt_sip_close();

int wrt_sip_set_video_window_id(unsigned long id);
int wrt_sip_set_preview_video_window_id(unsigned long id);


//音频视频编码解码接口
int wrt_sip_get_video_codecs_count();
int wrt_sip_get_audio_codecs_count();
unsigned long wrt_sip_get_video_codecs_payload(int index);
unsigned long wrt_sip_get_audio_codecs_payload(int index);
int wrt_sip_get_payload_codecs_mime(unsigned long payloadptr,char* mime);
int wrt_sip_set_enabled_payload(unsigned long payloadptr,int enabled);


//即时聊天配置
/**
基本使用方法：
1：主动创建窗口：
创建聊天窗口时调用wrt_sip_create_chat_room，输入对方的用户名后者sip地址。
当销毁聊天窗口时，调用wrt_sip_destroy_chat_room ,输入wrt_sip_create_chat_room()函数的返回值。
2：被动创建窗口
当有别的用户给你发送消息时，你再回调函数中收到指令：MSGID_MESSAGE_RECEIVED。
里面传出一个结构_wrt_instant_message结构。结构里面就带有一个unsigned long .这个值就是wrt_sip_create_chat_room()函数返回值。
如果你的窗口没有和这个值绑定，表示这需要新创建一个窗口，此时新建窗口，则不需要调用wrt_sip_create_chat_room（）函数

**/
unsigned long  wrt_sip_create_chat_room(const char* username);
int wrt_sip_destroy_chat_room(unsigned long chatroomptr);

//username 为输出参数，由外面自己分配空间不少于64个字节。
int wrt_sip_get_chat_room_peer_username(unsigned long chatroomptr ,char* username);

unsigned long wrt_sip_get_chatroomptr_by_username(const char* username); //format: sip:username@domain 


/*wrtsip ios  backmode*/

void wrt_sip_refresh_register();
void wrt_sip_iterator();

#ifdef __cplusplus
}
#endif
